package L_5_12.demo1;
//实例内部类
/*
    1.如何获取内部类对象
    2。在内部类中定义static成员时，要加上关键字
    public static final int d=60;
    因为static变量与对象无关，随着类的加载而被加载
    但是内部类与对象有关，他需要外部类对象的实例化，两者互相矛盾
    因此需要加上final关键字
    3.外部类中的数据成员与内部类中的数据成员相同的时候需要使用Out。this。

 */


/**
 * 匿名内部类
 * 1. 实例化与外部类无关，在实例内部类的实例化方法可以改为 Out.In in=new Out.In();
 * 2.在实例化内部类中，如果要访问外部类中的成员变量，由于外部类对象还没有实例化，
 * 因此需要先实例化外部对象，再进行访问，
 * Out out=new Out();
 * out.a.sout
 */


class Out {
    public int a = 10;
    private int b = 20;

    class In {
        public int a = 6666;
        public int c = 30;
        public static final int d = 60;

        public void test () {
            //in类和out类之间出现重复的成员的时候，此时打印内部类成员
            System.out.println (a);
            //下面的是打印外部数据成员的方法
            System.out.println (Out.this.a);

            System.out.println ("实例内部类");
        }
    }

}


public class test02 {
    public static void main (String[] args) {
        Out out = new Out ();
        Out.In in = out.new In ();


        //实例内部类应该为一个类的实例内部类
        //因此对内部类进行创建时，外部类必须已经存在
        in.test ();
        Out.In in2 = new Out ().new In ();
        in2.test ();
    }
}
